package com.lsh.serializable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.msgpack.annotation.Message;

import java.io.Serializable;
import java.nio.ByteBuffer;

/**
 * @author ：LiuShihao
 * @date ：Created in 2021/4/9 12:28 下午
 * @desc ：
 * UserInfo是一个普通的Java对象，实现了Serializable接口，并生成了序列化ID，可以通过JDK的Java序列化机制进行序列化和反序列化
 *
 */
//注意：巨坑：使用MessagePack编解码框架 传输的Java对象 一定要加上org.msgpack.annotation.Message 注解 才能 传输
@Message
//getset方法
@Data
//全参构造
@AllArgsConstructor
//无参构造
@NoArgsConstructor
public class UserInfo implements Serializable {
    private static final long serialVersionUID = -8018991226271912056L;

    private String userName;
    private int userID;
//    private ByteBuffer buffer;

    /**
     *
     * 使用基于ByteBuffer的通用二进制编解码技术对UserInfo对象进行编码，编码结果仍然是byte数组，
     * 可以与传统的JDK序列化后的码流大小进行对比
     *
     * Buffer的属性:
     * 容量（capacity）：缓冲区能够容纳的数据元素的最大数量。这一容量在缓冲区创建时被设定，并且永远不能被改变
     * 上界（limit）：缓冲区的第一个不能被读或写的元素。或者说，缓冲区中现存元素的计数
     * 位置（position）：下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新
     * 标记（mark）：下一个要被读或写的元素的索引。位置会自动由相应的 get( )和 put( )函数更新一个备忘位置。调用 mark( )来设定 mark = postion。调用 reset( )设定 position =mark。标记在设定前是未定义的(undefined)。这四个属性之间总是遵循以下关系：0 <= mark <= position <= limit <= capacity
     *
     * @return
     */
    public byte[] codeC(){
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        byte[] value = this.getUserName().getBytes();
        buffer.putInt(value.length);
        //put() :相对写，向position的位置写入一个byte，并将postion+1，为下次读写作准备
        buffer.put(value);
        buffer.putInt(this.userID);
        //Buffer有两种模式，写模式和读模式。在写模式下调用flip()之后，Buffer从写模式变成读模式。
        buffer.flip();
        value = null;
        //remaining() 返回limit和position之间相对位置差
        byte[] result = new byte[buffer.remaining()];

        buffer.get(result);

        return result;

    }

    public  byte[] codeC(ByteBuffer buffer){
        buffer.clear();
        byte[] value = this.userName.getBytes();
        buffer.putInt(value.length);
        buffer.put(value);
        buffer.putInt(this.userID);
        buffer.flip();
        value = null;
        byte[] result = new byte[buffer.remaining()];
        buffer.get(result);
        return result;
    }


}
